package day04;

/*
封装：将属性设置私有的，提供公共的get、set方法来访问属性。
      将数据封装在类的内部，只在类内部访问它，外部不能直接操作。

修饰符：public、private、protected、default(前面没有任何修饰符)
        public：公共的，任何地方可以访问
        private：私有的，只能在类内部访问
        protected：受保护的，在类的内部以及子类中访问
        default：缺省的，在包的内部访问，比如day04是一个包，
                 day04目录下的所有文件都可以访问到这个属性。
 */
public class Demo01 {
    public static void main(String[] args) {
        Student stu1 = new Student();
        stu1.name = "张飞";
        stu1.age = 18;
        stu1.gender = '男';
        System.out.println(stu1);

        stu1.gender = '神'; //设置属性值时，可以随意的设置，没有任何的限制
        System.out.println(stu1);

        Student1 stu2 = new Student1();
        //stu2.name = "李飞"; // 私有的属性外部无法访问
        stu2.setName("李飞"); // 通过公共的get\set方法访问
        stu2.setAge(19);
        stu2.setGender('男');
        System.out.println(stu2);

        stu2.setGender('仙');//可以在方法内加一些逻辑判断，限制非法的输入
        System.out.println(stu2);

    }
}


// 没有封装
class Student {
    String name; // 姓名
    char gender; // 性别
    int age; // 年龄

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}

/*
实现了封装：private修饰的属性，只能在类的内部访问。
 */
class Student1 {
    private String name; // 姓名
    private char gender; // 性别
    private int age; // 年龄

    // set方法设置属性的值
    public void setName(String name) {
        this.name = name;
    }

    // get方法获取属性的值
    public String getName() {
        return this.name;
    }

    // 每个属性提供get、set方法
    public char getGender() {
        return this.gender;
    }

    public void setGender(char gender) {
        if (gender == '男' || gender == '女') {
            this.gender = gender;
        } else {
            System.out.println("输入的性别不正确，请重新设置。");
        }

    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}

class Student2 {
    private String name;
    private char gender;
    private int age;

    // 自动生成：构造方法、get/set方法、toString

    public Student2(String name, char gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}

